package view;

/**il controller e' proprio come in sistemi operativi: come il controller fisico pilota l'hardware ricevendo e trasmettendo messaggi all'hardware
 * cosi' la classe controller pilota un'istanza di una View. Per questioni di efficienza, al controller deve essere associato il tipo di View
 * da controllare: in questo modo gli attributi
 * 
 * @author koldar
 *
 * @param <VIEW>
 */
public abstract class Controller<VIEW extends View>{
	
	protected VIEW controlledview;
	
	/**costruisce un nuovo controller che pilota la view immessa. Prima pero' di associare il controller alla view il programma
	 * verifica che il controller possa effetticamente pilotare la view, guardando se esso implementa almeno tutte le interfacce richieste.
	 * in caso affermativo, innesta il collegamento
	 * 
	 * @param _view la view da allacciare al controller
	 */
	public Controller(VIEW _view){
		this(_view,true);
	}
	/**costruisce un nuovo Controller. se listenerlink e' true, allora oltre a costruire il controller, aggiunge
	 * a tutti i componenti della view i relativi listener.
	 * 
	 * @param _view la view a cui collegare il Controller
	 * @param listenerlink aggiunge i listener se TRUE 
	 */
	public Controller(VIEW _view,boolean listenerlink){
		this.controlledview=_view;
		if (this.controlledview.isControllervalid(this)&&listenerlink){
			this.controlledview.addListeners(this);
		}
	}

	/**
	 * @return the controlledview
	 */
	public View getControlledview() {
		return controlledview;
	}

	/**
	 * @param controlledview the controlledview to set
	 */
	public void setControlledview(VIEW controlledview) {
		this.controlledview = controlledview;
	}
	
	/**metodo che viene richiamato quando l'applicazione viene chiusa. indica l'elenco delle
	 * istruzioni che vanno eseguite dal controller quando l'applicaizone deve essere chiusa
	 */
	public abstract void finalize();
	
	
	

}
